<?php

/**
 * Разбираем строку в объект
 * @param $sObject
 */
function __unserialize($sObject) {
  $__ret = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", $sObject);
  return unserialize($__ret);
}
/**
 * Класс предназначен для работы с сессиями
 *
 */
class User_Flash {
  static $arResult = array();
  static $isArrLoaded = false;

  /**
   * Конструктор. Переопределяет ф-ции для работы с сессией
   *
   */
  private function __construct() {
    Service_Debug::setDebug();
  }

  /**
   * Запись значения переменной $nm, относящееся к текущей сессии
   *
   * @param string $nm - Имя параметра
   * @param string $val - Значение параметра
   */
  public static function _set($nm, $val, $saveHtml = false) {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    if (!$saveHtml) $strSer = serialize(Service_Escape::absolutelyEscapeString($val)); //Сериализуем значение
    else $strSer = serialize(Service_Escape::absolutelyEscapeStringSavingHtml($val)); //Сериализуем значение
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "SELECT `ID_user_session` FROM `flash` WHERE `ID_user_session` = '" . $sessionId . "' AND `variable_name` = '" . $nm . "'";
    if ($objDB->isRecordExist($stmt)) {
      $stmt = "UPDATE `flash` SET `variable_value` = '" . $strSer . "' WHERE `ID_user_session` = '" . $sessionId . "' AND `variable_name` = '" . $nm . "'";
    }
    else {
      //Вставляем значение в БД для текущей сессии, данного названия переменной $nm
      $stmt = "INSERT INTO `flash` (`ID_user_session`,`variable_name`,`variable_value`) VALUES (" . $sessionId . ",'" . $nm . "','" . $strSer . "')";
    }
    $objDB->query($stmt);
  }

  /**
   * Удаление значения параметра из сессии
   *
   * @param string $nm - Имя параметра
   */
  public static function __delete($nm) {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "DELETE FROM `flash` WHERE ID_user_session = " . $sessionId . " AND variable_name='" . $nm . "'";
    $objDB->query($stmt);
  }

  /**
   * Удаление значения параметра из сессии
   *
   * @param string $nm - Имя параметра
   */
  public static function __deleteAllFromUser() {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $stmt = "DELETE FROM `flash` WHERE ID_user_session = " . $sessionId;
    $objDB->query($stmt);
  }

  /**
   * Функция берет переменую из сессии по имени
   *
   * @param string $nm - Имя параметра
   * @return string - Значение параметра
   */
  public static function _get($nm) {
    Service_Debug::setDebug();
    if (self::$isArrLoaded) {
      if (isset(self::$arResult[$nm])) return self::$arResult[$nm];
      else return null;
    }
    self::__getArray();
    return self::_get($nm);
  }

  /**
   * Функция записи массива значений массива переменных, относящихся к текущей сессии
   *
   * @param array $name - массив переменных
   */
  public static function __setArray($name) {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    foreach ($name as $key => $value) {
      $strSer = serialize($value); # Сериализуем значение
      $stmt = "INSERT INTO `flash` (`ID_user_session`,`variable_name`,`variable_value`) VALUES (" . $sessionId . ",'" . $key . "','" . $strSer . "')";
      $objDB->query($stmt);
    }
  }

  /**
   * Получение массва значений переменных
   *
   * @return false/массив значений переменных
   */
  public static function __getArray($loadNew = false) {
    Service_Debug::setDebug();
    if (self::$isArrLoaded && !$loadNew) return self::$arResult;
    self::$isArrLoaded = true;
    $objDB = Service_Database::instance();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $arr = $objDB->select("SELECT variable_value, variable_name FROM `flash` WHERE ID_user_session = " . $sessionId);
    for ($i = 0; $i < sizeof($arr); $i++) {
      self::$arResult[$arr[$i]['variable_name']] = $arr[$i]['variable_value'];
      if (sizeof(self::$arResult[$arr[$i]['variable_name']]) > 0) {# Если  есть элементы
        self::$arResult[$arr[$i]['variable_name']] = unserialize($arr[$i]["variable_value"]); # возвращаем значение # [sizeof($arResult)]
      }
    }
    if (sizeof(self::$arResult) > 0) {
      self::__deleteArray();
      return self::$arResult;
    }
    else # Если нет элементов
      return (false);
  }

  /**
   * метод добавляет переменную к массиву флэша или перезаписывает ее
   *
   * @param string $nm
   * @param mixed $value
   */
  public static function __addToLoadedArray($nm, $value) {
    self::__getArray();
    self::$arResult[$nm] = $value;
  }

  /**
   * Функция удаления записей значений массива переменных
   *
   */
  public static function __deleteStr() {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    $func_list = func_get_args();
    for ($i = 0; $i < sizeof($func_list); $i++) {
      $stmt = 'DELETE FROM `flash`
    		WHERE `variable_name` = "' . $func_list[$i] . '"';
      $objDB->query($stmt);
    }
  }

  /**
   * Функция удаления записей флэша
   *
   */
  public static function __deleteArray() {
    Service_Debug::setDebug();
    $objSession = User_Session::instance();
    $sessionId = $objSession->getUserSessionId();
    $objDB = Service_Database::instance();
    $stmt = "DELETE FROM `flash`
  		WHERE ID_user_session = " . $sessionId;
    $objDB->query($stmt);
  }

  /**
   * Удаляет ишние переменные сессий
   *
   */
  public static function _deleteBadVariables() {
    Service_Debug::setDebug();
    $objDB = Service_Database::instance();
    $stmt = "SELECT `ID_flash` FROM `flash`
						LEFT JOIN `session` ON `session`.`ID_user_session` = `flash`.`ID_user_session`
    				WHERE `session`.`last_impression` < DATE_SUB(now(), INTERVAL 14 MINUTE) OR `session`.`last_impression` IS NULL";
    $arrIds = $objDB->selectSimpleArray($stmt);
    if (!$arrIds) return false;
    $stmt = "DELETE FROM `flash`
    				WHERE `ID_session_variable` IN(" . implode(',', $arrIds) . ")";
    $objDB->query($stmt);
    return true;
  }
}
?>